#include "form.h"
#include "ui_form.h"
#include "addvote.h"

Form::Form(QWidget *parent,int _userID) :
    QWidget(parent),
    ui(new Ui::Form),
    userID(_userID)
{
    ui->setupUi(this);

    this->resize(1600,800);
    //设置一个图标
    QIcon icon(":/6.png");
    this->setWindowIcon(icon);
    this->setWindowTitle("网上投票管理系统");

    ui->label->move(400,0);
    this->setStyleSheet("#Form{border-image:url(:/5.jpg);}");

    //首先在界面上创建一个tableview
    //tableview是用于显示表格数据的控件

    //创建一个数据库表关联的数据模型，初始化模型
     model=new QSqlTableModel(this,db);
    //绑定投票主表
    model->setTable("Vote");
    //绑定到视图控件上
    ui->tableView->setModel(model);
    if(model->tableName().isEmpty())
    {
        qDebug()<<"表绑定失败";
        exit(3);
    }
    model->setHeaderData(0, Qt::Horizontal, tr("投票ID"));
    model->setHeaderData(1, Qt::Horizontal, tr("标题"));
    model->setHeaderData(2, Qt::Horizontal, tr("创建者"));

    //设置编辑策略
    //手动提交
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    //加载数据
    if(!model->select())
    {
        qDebug()<<"加载数据失败";
    }
    //禁用直接编辑
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);

    model2=new QSqlTableModel(this,db);
    model2->setTable("VoteRecord");//绑定视图
    // 设置列显示名称
    model2->setHeaderData(0, Qt::Horizontal, tr("投票ID"));
    model2->setHeaderData(1, Qt::Horizontal, tr("选项ID"));
    model2->setHeaderData(2, Qt::Horizontal, tr("选项内容"));
    model2->setHeaderData(3, Qt::Horizontal, tr("得票数"));

    //关联视图与模型
    ui->tableView_2->setModel(model2);
}

Form::~Form()
{
    delete ui;
}

//点击新建按钮，输入标题，截止时间，选项
void Form::on_pushButton_create_clicked()
{
    //进入新窗口
    AddVote* addvote=new AddVote(this,userID);
    addvote->show();
}

//删除一个投票 只能删除自己创建的
void Form::on_pushButton_delete_clicked()
{
    //弹出一个输入对话框，获取用户输入要删除的投票的ID
    int VoteID=QInputDialog::getInt(this,">>>","输入你要删除的投票的ID");

    QSqlQuery query(db);
    query.prepare("{CALL sp_DeleteVote(?, ?)}");
    query.bindValue(0,VoteID);
    query.bindValue(1,userID);

    if(!query.exec())
    {
        QString error=query.lastError().text();
        if(error.contains("无权删除该投票"))
        {
            QMessageBox::warning(this,"权限不足","您无权删除次投票!!!");
        }
        else
        {
            QMessageBox::critical(this,"错误","删除操作失败");
        }
        return;
    }

    QMessageBox::information(this,"成功",QString("投票 #%1 已删除").arg(VoteID));
}
//通过voteID获取到对应投票的标题
QString getVoteTitleByID(int voteID) {
    QSqlQuery query(db);
    query.prepare("SELECT Title FROM Vote WHERE VoteID = :voteID");
    query.bindValue(":voteID", voteID);

    if (!query.exec()) {
        QMessageBox::critical(nullptr, "数据库错误",
            "查询失败: " + query.lastError().text());
        return QString();
    }

    if (query.next()) {
        return query.value("Title").toString();
    } else {
        QMessageBox::warning(nullptr, "提示",
            QString("未找到ID为 %1 的投票").arg(voteID));
        return QString();
    }
}
//用户参与投票，选择一个活动，进行投票
void Form::on_pushButton_attend_clicked()
{
    //弹出一个输入对话框
    voteID=QInputDialog::getInt(this,">>>","输入你要进行投票的投票的ID");
    //对应活动的标题
    QString title=getVoteTitleByID(voteID);
    //加载投票选项
    QSqlQuery query(db);
    query.prepare(
                "SELECT OptionID, OptionText, MaxChoices "
                       "FROM VoteOption "
                       "JOIN Vote ON Vote.VoteID = VoteOption.VoteID "
                       "WHERE VoteOption.VoteID = ?");
    query.bindValue(0, voteID);
    if(!query.exec())
    {
        QMessageBox::critical(this,"错误","加载失败");
        return;
    }

    //获取选项
    QStringList optionList;
    int maxChoices = 1;
     if (query.next()) {
         maxChoices = query.value("MaxChoices").toInt();
         do {
             QString text = QString("%1. %2").arg(query.value("OptionID").toString())
                                             .arg(query.value("OptionText").toString());
             optionList.append(text);
         } while (query.next());
     }


    //以下部分进行硬编码，不太好看
    //实际应该再封装一个类来实现

    //for test测试思路
//    QStringList optionList;
//    for(int i=0;i<3;i++)
//        optionList.append("C++");

    //创建一个小窗口，包含这几个选项
    widget=new QDialog(this);
    QIcon icon(":/7.png");
    widget->setWindowIcon(icon);
    widget->resize(1000,800);
    widget->show();

    //使用布局管理器管理控件
    QVBoxLayout* layout=new QVBoxLayout();//垂直布局
    widget->setLayout(layout);//添加到窗口中

    QHBoxLayout* layout1=new QHBoxLayout();//水平布局

    //在这个小窗口中，添加一个标签
    QLabel* label=new QLabel(widget);
    label->move(100,50);
    label->setText(title);
    label->setAlignment(Qt::AlignCenter);//设置文字居中
    QFont font;
    font.setPointSize(20);
    label->setFont(font);//设置字体大小

    layout->addWidget(label);

    //获取选项的个数
    //规定：第i个选项的选项ID就是i
    //所以下面在遍历的时候就可以直接获取到选项ID
    for(int i=0;i<optionList.size();i++)
    {
        radiobutton[i]=new QRadioButton();
        radiobutton[i]->setText(optionList[i]);
        layout1->addWidget(radiobutton[i]);
    }
    layout->addLayout(layout1);//将水平布局添加到垂直布局管理器中
    //再添加一个确定按钮
    button_sure=new QPushButton(widget);
    button_sure->setText("确定投票");
    layout->addWidget(button_sure);
    //关联槽函数
    connect(button_sure,&QPushButton::clicked,this,&Form::handle);
}
// 获取客户端IP
QString getClientIP()
{
    const QHostAddress &localhost = QHostAddress(QHostAddress::LocalHost);
    foreach (const QHostAddress &address, QNetworkInterface::allAddresses()) {
        if (address.protocol() == QAbstractSocket::IPv4Protocol
            && address != localhost) {
            return address.toString();
        }
    }
    return "127.0.0.1";
}
//用户选择了一个选项
//点击确定按钮后，记录投票结果
void Form::handle()
{
    QString result;//记录用户选的选项
    //找到哪个选项
    for(int i=0;i<10;i++)
    {
        if(radiobutton[i]==nullptr)
            continue;
        if(radiobutton[i]->isChecked())//如果按钮被选中返回true
        {
            result=radiobutton[i]->text();
            break;
        }
    }
    if(result.isEmpty())
    {
        //说明用户没有进行选择
        QMessageBox::information(this,"抱歉！！","您为选择任何选项!!");
        return;
    }

    //获取对应的optionID
    int optionID=0;
    for(int i=0;i<result.size();i++)
    {
        if(result[i].digitValue()>=0&&result[i].digitValue()<=9)
            optionID=result[i].digitValue()+optionID*10;
    }

    //插入投票记录
    QSqlQuery query(db);
    query.prepare(
        "INSERT INTO VoteRecord "
        "(VoteID, UserID, OptionID, IPAddress) "
        "VALUES (?, ?, ?, ?)"
    );
    QString clientIp=getClientIP();
    query.bindValue(0,voteID);
    query.bindValue(1,userID);
    query.bindValue(2,optionID);
    query.bindValue(3,clientIp);

    if (!query.exec()) {
        throw std::runtime_error(
            QString("投票失败：%1").arg(query.lastError().text()).toStdString()
        );
    }

    //完成投票工作

    //关闭widget窗口
    widget->close();
}

//刷新投票
void Form::on_pushButton_flusshvote_clicked()
{
    model->setHeaderData(0, Qt::Horizontal, tr("投票ID"));
    model->setHeaderData(1, Qt::Horizontal, tr("标题"));
    model->setHeaderData(2, Qt::Horizontal, tr("创建者"));
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);

    ui->tableView->setModel(model);
    // 重新选择数据
    if (!model->select()) {
        QMessageBox::critical(this, "错误",
            "刷新失败：" + model->lastError().text());
        return;
    }
}

//刷新记录
void Form::on_pushButton_flusshrecord_clicked()
{
    model2->setTable("vw_VoteResults");//绑定视图
    //加载数据
    if(!model2->select())
    {
        QMessageBox::critical(this,"错误","刷新失败");
        return;
    }
}
